#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

const int MAX = 5000;

int typeDestination(char* dest);
int copy(int argc, char** src, char* dest);

int main(int argc, char** argv) {

	if (argc > 2) {
		int i;
		for (i = 1; i < argc - 1; i++) {
			if (strcmp(argv[1], argv[i + 1]) == 0) {
				fprintf(stderr, "Deux fichiers sont égaux");
				return EXIT_FAILURE;
			}
		}
		return copy(argc, argv, argv[argc - 1]);
	}
	fprintf(stderr, "Nombre de paramètres incorrects");
	return EXIT_FAILURE;
}

// Copier
int copy(int argc, char** argv, char* dest) {

	int i;
	for (i = 1; i < argc - 1; i++) {
		if (typeDestination(argv[i]) == 0) {
			fprintf(stderr, "Le dossier %s ne sera pas copié dans %s", argv[i],
					dest);
			return EXIT_FAILURE;
		} else {
			char buffer[MAX];
			int n;
			int fdin;
			int fdout;
			fdin = open(argv[i], O_RDONLY | O_EXCL);

			// Si la destination est un fichier
			if (typeDestination(dest) == 1) {
				fdout = open(dest, O_RDWR | O_TRUNC | O_CREAT, S_IRWXU);
				if (fdout == -1) {
					fprintf(stderr, "Erreur de descripteur de fichiers : ");
					fprintf(stderr, "Erreur avec le fichier : %s\n", dest);
				}
				while ((n = read(fdin, buffer, MAX)) > 0) {
					write(fdout, buffer, n);
				}
				close(fdout);
			}
			// Si la destination est un dossier
			else {
				/**
				 * MARCHE PAS
				 */
				fdout = open(dest, O_DIRECTORY);


				if (fdout == -1) {
					fprintf(
							stderr,
							"Dans le else, Erreur de descripteur de fichiers : ");
					fprintf(stderr, "Erreur avec le fichier : %s\n", dest);
				}
				while ((n = read(fdin, buffer, MAX)) > 0) {
					write(fdout, buffer, n);
				}
				close(fdout);
			}

			if (fdin == -1) {
				fprintf(stderr, "Erreur de descripteur de fichiers : ");
				fprintf(stderr, "Erreur avec le fichier : %s\n", argv[i]);
			}

			close(fdin);
		}
	}
	return EXIT_SUCCESS;
}

// Retourne le type du fichier (0 = répertoire ou 1 = fichier normal)
int typeDestination(char* dest) {
	struct stat sbuf;
	if (stat(dest, &sbuf) >= 0) {
		if (S_ISDIR(sbuf.st_mode))
			return 0;
	}
	return 1;
}

